09. 单精度和双精度浮点数[示范区]
单精度和双精度浮点数
在最后一部分,你看到了一张包括基础的 C++ 数据类型及其声明的表:
数据类型 | 声明 |
---|---|
整数 | int |
单精度浮点数 | float |
双精度浮点数 | double |
字符 | char |
布尔型 | bool |
无值型 | void |
单精度和双精度浮点数究竟有何区别?
小测试:单精度浮点数 vs 双精度浮点数
单精度浮点数 vs 双精度浮点数
SOLUTION:
- 单精度在小数点后有7位有效数字,而双精度有15位。
- 通常来说,使用双精度会减少舍入误差。
- 双精度能用于表示更大的数字。
两种数据类型都可以表述包括小数点的数字:
float x = 5.79;
以及
double x = 5.79;
但是,双精度浮点数包括的位数是单精度浮点数的两倍。但有利有弊:它所需的存储空间也同样翻倍。
在下面的演示中,你可以看到,有时候存储更多的位数非常重要,尤其是在精确度要求比较高的情况下。
演示:单精度浮点数 vs 双精度浮点数定义
下面的代码会向你展示单精度和双精度浮点数类型之间的区别。这段代码将 11.0 赋值给了一个单精度浮点数变量和一个双精度浮点数变量。接下来,每个变量都除以 10 万。
然后,通过一个 for 循环将每个变量重复求和 10 万次,查看两个变量的结果和 11.0 相差多少。你会看到,两个变量求和的结果都不是 11.0,因为内存只能保留有限的小数点位数。但是,双精度浮点数的结果更接近 11.0。
完整阅读这段代码,然后点击“测试运行”按钮,查看演示的输出结果。
Start Quiz:
#include <stdio.h>
int main() {
// define floating point numbers
float float_num;
float float_sum = 0;
double double_num;
double double_sum = 0;
int divisions = 100000;
// divide the floating point numbers by divisions
float_num = 11.0/divisions;
double_num = 11.0/divisions;
// sum the number by the number of divisions to see how close the results
// get to 11.0
for (int i = 0; i < divisions; i++) {
float_sum = float_sum + float_num;
double_sum = double_sum + double_num;
}
printf("Floating point sum: %.15g\n", float_sum);
printf("Double sum: %.15g\n", double_sum);
return 0;
}